package com.wn.consumer.demo05;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author yellow Docter
 * @date 2022 -11-02
 * @desc
 */
@Component
@Slf4j
public class ConfirmConsumer {

    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue("confirm-queue"),
                    exchange = @Exchange(
                            name = "exchange-confirm",
                            type = ExchangeTypes.DIRECT
                    ),
                    key = "confirm.msg"
            )
    )
    public void handlerMsg(String msg, Channel channel, Message message) throws IOException {

        // 通过channel 进行确认  (Connection 连接中的通道 这里有很多 mq的api)
        // message MQ中的消息对象

        log.info("ConfirmConsumer消费消息:{}",msg);

        //通过 message 拿到消息的标记 tag
        // 消息的属性  tag
        long deliveryTag = message.getMessageProperties().getDeliveryTag();


        //手动消息消息进行确认
        //参数1、 消息的标签   参数2、消息是否批确认
        try {

            int a = 10 / 0;

            channel.basicAck(deliveryTag,false);
        } catch (Exception e) {
            e.printStackTrace();
            // 消息是否 回退到 队列中
            Boolean redelivered = message.getMessageProperties().getRedelivered();
            if (redelivered){
                // 重新投递的消息: 直接拒绝掉
                // 消息投递序号 是否将消息回退到队列
                channel.basicReject(
                        deliveryTag,false);
                log.info("消息消费异常，消息作废...");

            }else{
                // 该消息没有被重新投递过, 进行重投
                // 消息投递序号  是否批量  是否将消息回退到队列
                channel.basicNack(deliveryTag,false,true);
                log.info("消息消费异常，消息进行重投");
            }
        }
    }

}
